#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

//double find(int* arr1, int* arr2, int size1,int size2)
//{
//	int i = 0;
//	int j = 0;
//	int k = 0;
//	if ((size1 + size2) % 2 == 1)
//	{
//		k = (size1 + size2) / 2;
//	}
//	else
//	{
//		k = (size1 + size2) / 2 - 1;
//	}
//	for (int m = 0; m < k; m++)
//	{
//		if (i < size1 && j < size2)
//		{
//			if (*(arr1 + i) <= *(arr2 + j))
//			{
//				i++;
//
//			}
//			else
//			{
//				j++;
//			}
//
//		}
//		else
//		{
//			if (i < size1)
//			{
//				i++;
//			}
//			if (j < size2)
//			{
//				j++;
//			}
//		}
//	}
//	if ((size1 + size2) % 2 == 1)
//	{
//		if (*(arr1 + i) < *(arr2 + j))
//		{
//			return *(arr1 + i);
//		}
//		else
//		{
//			return *(arr2 + j);
//		}
//	}
//	else
//	{
//		return ((double)*(arr1 + i) + (double)*(arr2 + j)) / 2.0;
//	}
//}

double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size)
{

	int i = 0;
	int j = 0;
	int k = 0;
	if (nums1Size == 0)
	{
		if (nums2Size % 2 == 1)
		{
			return *(nums2 + (nums2Size / 2 ));
		}
		else
		{
			return ((double)*(nums2 + (nums2Size / 2)) + (double)*(nums2 + (nums2Size / 2 - 1)))/2;
		}
	}
	if (nums2Size == 0)
	{
		if (nums1Size % 2 == 1)
		{
			return *(nums1 + (nums1Size / 2));
		}
		else
		{
			return ((double)*(nums1 + (nums1Size / 2)) + (double)*(nums1 + (nums1Size / 2 - 1))) / 2;
		}
	}
	if (nums1Size +nums2Size ==2)
	{
		if (nums1Size == 0)
		{
			return ((double)nums2[0] + (double)nums2[1]) / 2;
		}
		else if (nums2Size == 2)
		{
			return ((double)nums1[0] + (double)nums1[1]) / 2;
		}
		else
		{
			return ((double)nums1[0] + (double)nums2[0]) / 2;
		}
	}
	if ((nums1Size + nums2Size) % 2 == 1)
	{
		k = (nums1Size + nums2Size) / 2;
	}
	else
	{
		k = (nums1Size + nums2Size) / 2 - 1;
	}
	for (int m = 0; m < k; m++)
	{
		if (i < nums1Size && j < nums2Size)
		{
			if (*(nums1 + i) <= *(nums2 + j))
			{
				i++;
			}
			else
			{
				j++;
			}

		}
		else
		{
			if (i < nums1Size)
			{
				i++;
			}
			if (j < nums2Size)
			{
				j++;
			}
		}
	}
	if (i < nums1Size && j < nums2Size)
	{
		if ((nums1Size + nums2Size) % 2 == 1)
		{
			if (*(nums1 + i) < *(nums2 + j))
			{
				return *(nums1 + i);
			}
			else
			{
				return *(nums2 + j);
			}
		}
		else
		{
			if (i + 1 < nums1Size  && j + 1 < nums2Size )
			{
				if (*(nums1 + i) < *(nums2 + j))
				{

					if (*(nums2 + j) <= *(nums1 + i + 1))
					{
						return ((double)*(nums1 + i) + (double)*(nums2 + j)) / 2.0;
					}
					else
					{
						return ((double)*(nums1 + i) + (double)*(nums1 + i + 1)) / 2.0;
					}
				}
				else
				{
					if (*(nums1 + i) <= *(nums2 + j + 1))
					{
						return ((double)*(nums2 + j) + (double)*(nums1 + i)) / 2.0;
					}
					else
					{
						return ((double)*(nums2 + j) + (double)*(nums2 + j + 1)) / 2.0;
					}



				}
			}
			else if (i + 1 > nums1Size - 1)
			{
				if (*(nums1 + i) < *(nums2 + j + 1))
				{
					return ((double)*(nums1 + i) + (double)*(nums2 + j)) / 2;
				}
				else
				{
					return ((double)*(nums2 + j) + (double)*(nums2 + j+1)) / 2;
				}
			}
			else
			{
				if (*(nums1 + i+1) > *(nums2 + j ))
				{
					return ((double)*(nums1 + i) + (double)*(nums2 + j)) / 2;
				}
				else
				{
					return ((double)*(nums1 + i+1) + (double)*(nums1 + i )) / 2;
				}
			}
		}
	}
	else if (i >= nums1Size)
	{
		if ((nums1Size + nums2Size) % 2 == 1)
		{
			if (*(nums2 + j) < *(nums2 + j+1))
			{
				return *(nums2 + j);
			}
			else
			{
				return *(nums2 + j+1);
			}
		}
		else
		{
			return ((double)*(nums2 + j) + (double)*(nums2 + j+1)) / 2.0;
		}
	}
	else
	{
		if ((nums1Size + nums2Size) % 2 == 1)
		{
			if (*(nums1 + i) < *(nums1 + i + 1))
			{
				return *(nums1 + i);
			}
			else
			{
				return *(nums1 + i + 1);
			}
		}
		else
		{
			return ((double)*(nums1 + i) + (double)*(nums1 + i + 1)) / 2.0;
		}
	}
	
}


int main()
{
	int arr1[] = { 1,2,5,6};
	int arr2[] = { 3,4};
	double x = findMedianSortedArrays(arr1,4,arr2,2);
	printf("%lf\n", x);
	return 0;
}
